import objectTs from './object';

// 基础类型 小写表示基础类型
let a: string = 's';
const age: number = 30;
const gender: boolean = true;
const u: undefined = undefined; // 严格模式下 只能赋值为 undefined
const n: null = null; // 严格模式i下 只能赋值 null
let xx:void = undefined;

// 实例类型 大写描述的是实例类型
let s3: String = ''; // 子集奎幺也赋予给父级.
let s4: String = String('1');
let s5: string =  String('2');// 报错

// 数组类型
let arr1: number[] = [1,2,3,4];
let arr2: Array<number> = [1,2,3,4,5];
let arr3: (number | string)[] = [1,'2',33,'abc'];

// 元组 tuple
// 你赋予的值要求得符合这个结构和顺序.
// 元组在新增内容的时候,不能增加额外的类型得值,只能是已有的,而且增加后无法访问.
let tuple:[string, number, string, number] = ['a', 1,'2',4];
tuple.push('x');
let item = tuple[1];
// 已经约定好没有第四个,后续增加的不算,访问的时候不能访问后面增加的.(安全问题)
// item = tuple[4]; // 报错

// 枚举: 自带类型的对象(自己有类型,就是一个对象)
// 状态码 权限 数据格式 标志位
// 维护一组常量的时候
// 类型可以进行反举 (值是数字的时候 可以反过来枚举), 枚举没有值会根据上面的索引来自动累加
// 异构枚举 就是枚举中不光有数字 还有字符串. 异构枚举上一个是字符串下一个无法推导.
enum STATUS {
    'OK' = 'ok',
    'ERROR' = 100,
    'NOT_FOUND' ,
    'WARNING',
}
console.log(STATUS[100]); // ERROR
console.log(STATUS[101]); // NOT_FOUND
// console.log(STATUS.ok); // 报错.常量枚举 不会反过来.

// 非严格模式下,null,undefined 可以赋予给任何类型.

// void 类型代表的是空类型,   一般表示函数的返回值
// undefined 可以赋予给void  (undefined 是 void的子类型)
function ax():void {
    return undefined;
}
// never 永远不.
// 函数无法执行完毕
// 常用于完整性保护
function whileTrue(): never {
    while (true) {}; // 函数无法达到执行完毕的状态.
}

function throwError(): never {
    throw Error(); // 出错函数无法执行完毕.
}
function validateCheck(v: never) {} // 完整性保护
function toArray(val: number | string | boolean) {
    if(typeof val === 'number') {
        return val.toString().split('').map(n => Number(n));
    }else if(typeof val === 'string') {
        return val.split('');
    }else if(typeof val === 'boolean') {
        return val.toString().split('');
    }
    validateCheck(val);
}

// any 能不写就不写.导致类型检测丧失. 放弃检测.



export {}; // 这是一个独立的模块,不会影响其他地方. 作用域隔离
